package com.test.employeedemo.action;

import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
import com.test.employeedemo.bean.Employee;
import com.test.employeedemo.dao.Dao;
import lombok.Getter;
import lombok.Setter;
import org.apache.struts2.interceptor.RequestAware;

import java.util.List;
import java.util.Map;

/**
 * @author lzy
 * @version v1.0
 * Create DateTime: 2018/9/9 20:24
 */
public class EmployeeAction implements RequestAware, ModelDriven<Employee>, Preparable {
    private Dao dao = new Dao();
    private Map<String, Object> requestMap;
    @Getter
    @Setter
    private Employee employee;
    @Getter
    @Setter
    private Integer employeeId;

    /*
     * 需要在当前的EmployeeAction中定义employeeId属性
     * 以接收请求参数
     */

    public String list() {
        List<Employee> emps = dao.getEmployees();
        requestMap.put("emps", emps);
        return "list";
    }

    public String save() {
        //1.获取请求参数，通过定义对应属性的方法
        //2.调用dao的save方法
        dao.save(employee);
        //3.通过redirectAction的方式响应结果给list
        return "save";
    }

    public void prepareSave() {
        employee = new Employee();
    }

    public String edit() {
        // 1.获取传入的employeeId：employee.getEmployeeId();
        // 2.根据employeeId获取Employee对象
        // Employee emp = dao.getEmployeeById(employee.getEmployeeId());
        // 3.把栈顶对象的属性装配好
        // 目前的employee对象只有employeeId属性，其他值为null
        /*
         * Struts2表单回显时，从值栈栈顶开始查找匹配的属性
         * 若找到就添加到value属性中
         */
        // employee.setEmail(emp.getEmail());
        // employee.setFirstName(emp.getFirstName());
        // employee.setLastName(emp.getLastName());

        // 不能够进行表单的回显，因为经过重写赋值的employee对象已经不再是栈顶对象
        // employee = emp;

        // 手动的把从数据库获取的Employee对象放到值栈的栈顶
        // 但是此时值栈栈顶及第二个对象均为Employee对象，不够完美
        // ActionContext.getContext().getValueStack().push(emp);

        //  dao.save(employee);

        return "edit";
    }

    public void prepareEdit() {
        employee = dao.getEmployeeById(employeeId);
    }

    public String update() {
        dao.update(employee);
        return "success";
    }

    public void prepareUpdate() {
        employee = new Employee();
    }

    public String delete() {
        dao.delete(employeeId);
        // 返回结果的类型为：redirectAction
        // 也可以使用chain，实际上chain是没有必要的，因为不需要在下一个Action中保留当前Action的状态
        //还有，若使用chain，则到达目标页后，地址栏显示的依然是删除的那个连接，刷新时会有重复提交
        return "delete";
    }

    @Override
    public void setRequest(Map<String, Object> request) {
        this.requestMap = request;
    }

    @Override
    public Employee getModel() {
        //判断是create还是edit
        //若为create，则employee = new Employee
        //若为edit，则employee=dao.get(employeeId)
        //判定标准为是否有employeeId这个请求参数，若有该参数，则视为edit，若没有改参数，则视为create
        //这意味着若通过employeeId来判断，则需要modelDriven拦截器之前先执行一个params拦截器
        //而这可以通过使用paramPrepareParams拦截器栈实现
        //需要在struts.xml文件中配置使用paramPrepareParams作为默认的拦截器栈
        /*if (employeeId == null) {
            employee = new Employee();
        } else {
            employee = dao.getEmployeeById(employeeId);
        }*/
        return employee;
    }

    /**
     * prepare方法的主要作用：为getModel（）方法准备model的
     *
     * @throws Exception
     */
    @Override
    public void prepare() throws Exception {
        System.out.println("prepare...");
    }
}
